package com.sise.DFS;

/**
 *      463. 岛屿的周长
 *
 *      给定一个 row x col 的二维网格地图 grid ，其中：grid[i][j] = 1 表示陆地， grid[i][j] = 0 表示水域。
 *      网格中的格子 水平和垂直 方向相连（对角线方向不相连）。整个网格被水完全包围，但其中恰好有一个岛屿（或者说，一个或多个表示陆地的格子相连组成的岛屿）。
 *      岛屿中没有“湖”（“湖” 指水域在岛屿内部且不和岛屿周围的水相连）。格子是边长为 1 的正方形。网格为长方形，且宽度和高度均不超过 100 。计算这个岛屿的周长。
 *
 *      题解：
 *      每当在 DFS 遍历中，从一个岛屿方格走向一个非岛屿方格，就将周长加 1。非岛屿方格有两种可能，一是 出边界、二是 遇见海
 */
public class _463_islandPerimeter {
    public int islandPerimeter(int[][] grid) {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    return dfs(grid, i, j);
                }
            }
        }
        return 0;
    }

    private int dfs(int[][] grid, int row, int col) {
        if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length) {        // 超过边界，那么周长 +1
            return 1;
        }

        if (grid[row][col] == 0) {         // 遇见海洋，那么周长 +1
            return 1;
        }

        if (grid[row][col] != 1) {         // 0 或者 2 的情况，由于前面已经对 0 进行检测过滤，所以这么只有 2 的情况，不用加
            return 0;
        }

        grid[row][col] = '2';               // 能走到这一步说明当前节点为 1 ，那么将此节点作为 走过的陆地设置为 2

        return    dfs(grid, row + 1, col)       // 将当前节点可以走的所有路的返回值都加起来，能走到这里，说明没有遇见边界，海洋
                + dfs(grid, row - 1, col)
                + dfs(grid, row, col + 1)
                + dfs(grid, row, col - 1);
    }
}
